. .
.. .
.
.
誤差の怖い話
—浮動小数点数
樋口さぶろお
龍谷大学理工学部数理情報学科
数値計算法L02(2010-04-16)
今日の目標
.
.
.
1 浮動小数点数はどんな形でメモリに置 かれてるか
.
.
.
2 いろんな誤差
.
.
.
3 人間による有効数字を考慮した計算
http://hig3.net
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 1 / 16
誤差の怖い話—浮動小数点数 指数表記と有効数字
指数表記または科学表記
物理実験
.
有効数字s+ 1桁の指数表記
.
.
.
.. .
.
.
±n0.n1n2n3n4· · ·ns×10e 符号 ±
仮数部 n0.n1n2n3n4· · ·ns (s+ 1個の数字) 指数部 e(整数)
例 −1.2345×103. 仮数部の0桁目は 1≤n0 ≤9 と限定
限定しないと
−0.12345 × 104とも書けちゃう
n0.n1n2n3n4· · ·ns = 1.2345のとき,真の値 x は1.23445≤x <1.23455 というつもり 桁分の数字を信じていい 有効数字 は 桁
誤差の怖い話—浮動小数点数 指数表記と有効数字
.
指数表記の利点
.
.
.
.. .
.
.
.
.
.
1 有効数字を明確にできる.
いい分銅 1.0000000×100 kg, 安物の分銅1.000×100kg
.
.
. 2 エコ8桁電卓の表示領域のエコな使い方
黒板でやるね〜
同じ8桁でも指数表記なら広い範囲を記述できる.
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 3 / 16
誤差の怖い話—浮動小数点数 指数表記と有効数字
指数表記で答えよう
!.
例題
.
.
.
.. .
.
.
富士山の高さは何 m? 有効数字3桁で. 日本の人口は何人? 有効数字2桁で.
自分の身長は何cm? 自分の知ってるだけの有効数字で.
黒板でやるね〜
誤差の怖い話—浮動小数点数 浮動小数点数
浮動小数点数って指数表記的なメモリ格納方法
¨
§
¥
栗原§1.2¦
doubleは64bit,floatは32bitの 浮動小数点数 . 指数表記を使って代入することができる.
E =×10
¶ 代入 ³
double x=838.88; /*x= 8.3888×102*/
double y=-1.2345E-12; /*指数表記y=−1.2345×10−12*/
float z=3.879E+9; /*指数表記z= 3.879×109*/
µ ´
.
浮動(floating)小数点(point)って?
.
.
.
.. .
.
.
−0.000000000012345や3879000000.0なのに,指数部を使って便利な場 所に小数点を動かしてるでしょ.
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 5 / 16
誤差の怖い話—浮動小数点数 浮動小数点数
浮動小数点数のデータ構造
float(32bit)の場合
s e n
符号 s1bit s=±1. 0→s= +1,1→s=−1.
指数部 e8bit 0≤e≤255.
仮数部 n23 bit 0≤n≤223−1.
表す数: s×(1 + 2−24n)×2e−127.
あれっなんかすごく複雑になってる…要するに.
黒板でやるね〜
誤差の怖い話—浮動小数点数 いろんな誤差
やっぱり字幕
(2進
)より吹替
(10進
)が楽
ここからは
なんちゃって10進浮動小数点数myfloat のおとぎ話 または
指数表記による有効数字を考慮した手計算のたとえ話 で中継します.
すべての数は
±n0.n1n2n3n4n5×10±e1e2
適宜頭の中で翻訳してお楽しみください.
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 7 / 16
誤差の怖い話—浮動小数点数 いろんな誤差
代入で大ピ〜ンチ
!¨
§
¥
栗原§1.2¦
¶ ³
myfloat x=1.234567890E9;
µ ´
1.23457×109 が代入されて少しずれる.
丸め誤差
おとぎ話の欠点実際は10進でなく2進で記録される.
3.140000000000 のような, 10進であるところから先が0の数にも丸め誤
差がでる. Ã きょうのquiz
誤差の怖い話—浮動小数点数 いろんな誤差
かけ算で大ピ〜ンチ
!1.23456×1013×7.89012×10−42= 9.740826547×10−29 積の有効数字の桁数は5桁のまま変わらない.
消したところは,有効数字以下の影響を受けるので信じられない. だって,有効数字1桁のときを想像してみて.
2×102×3×105= 6.0×107 だけど,3→3.1 で6→6.2 でしょ.
オーバーフロー
,アンダーフロー
5.00000×1040.00000×1059= 1.5000×10100 は∞ として扱われる. 5.00000×10−40.00000×10−61= 1.5000×10−100 0として扱われる. オーバーフロー,アンダーフローは加算減算でも起きる(もちろん).
手計算の場合,指数部の桁数には制限をつけないのでこの問題は起きない
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 9 / 16
誤差の怖い話—浮動小数点数 いろんな誤差
足し算引き算で大ピ〜ンチ
!¨
§
¥
栗原§1.2¦
1.23456×104+ 7.89012×100=??
12345. 6 +) 7. 89012
12353. 49012→1.23534×104. 有効数字は6桁のまま.
下の方の桁9012の情報が使われない.
情報落ち
誤差の怖い話—浮動小数点数 いろんな誤差
足し算引き算でもっとひどい大ピ〜ンチ
!1.23456×104+ 7.89012×10−3=??
12345. 6
+) 0. 00789012
12345. 60789012→1.23456×104.
2個目の数の情報がまったく消えてしまう. 数を足したのに変化しない. 危険なプログラム
¶ ³
int i;
myfloat x=1;
for(i=0;i<1.0E+7;i++){ x=x+1.0E-7;
}
µ ´
最後にxは2になるか?
float, double樋口さぶろお (数理情報学科)の数を多くの回数加えるのは危険誤差の怖い話—浮動小数点数 . 数値計算法L02(2010-04-16) 11 / 16
誤差の怖い話—浮動小数点数 いろんな誤差
引き算の大ピ〜ンチ
!¨
§
¥
栗原§1.2¦
1.23456×105−1.23442×105 = 1.2×102 有効数字2桁に減っちゃう!
近い数同士の差を取ると有効数字が減って精度が落ちる.
桁落ち
誤差の怖い話—浮動小数点数 いろんな誤差
演算順序で大ピ〜ンチ
!!¶ ³
myfloat x=1.0+1E-10-1.0;/*=(1.0+1E-10)-1.0;*/
myfloat y=1e-10;
myfloat z=1.0E-51 * 1.0E-51 * 1.0E+51;
myfloat w=1.0E-51 * 1.0E+51 * 1.0E-51;
myfloat a=(1.00000E5+1.23456E0)*(1.00000E5+1.23456E0) -1.00000E5*1.00000E5; /*(c+d)(c+d)−c2*/
myfloat b=2.0*1.23456E0+1.23456E0*1.23456E0; /*2cd+d2*/
µ ´
結果は同じか? ¤£栗原 例題14,15¡¢
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 13 / 16
誤差の怖い話—浮動小数点数 いろんな誤差
誤差の怖い話—浮動小数点数 いろんな誤差
.
例題
.
.
.
.. .
.
.
仮数部の有効数字3桁の myfloatを使って,次の計算結果を求めよう. 1.00E2+1.23E0
(1.00E2+1.23E0)*(1.00E2+1.23E0)-1.00E2*1.00E2
樋口さぶろお (数理情報学科) 誤差の怖い話—浮動小数点数 数値計算法L02(2010-04-16) 15 / 16
誤差の怖い話—浮動小数点数 いろんな誤差
今日出てきた誤差の種類 オーバーフロー アンダーフロー 丸め誤差 情報落ち 桁落ち 今後出てくる誤差
打ち切り誤差 離散化誤差